package com.hyfrogx.modules.app.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hyfrogx.common.param.ScoreSourceType;
import com.hyfrogx.common.utils.Query;
import com.hyfrogx.common.utils.QueryExt;
import com.hyfrogx.common.utils.R;
import com.hyfrogx.modules.app.annotation.Login;
import com.hyfrogx.modules.app.entity.HyAskCode;
import com.hyfrogx.modules.app.entity.HyInviteInfo;
import com.hyfrogx.modules.app.entity.User;
import com.hyfrogx.modules.app.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @version 1.0.0
 * @Author: lfh
 * @Date: 2019/10/23 9:20
 * @Company 汉咏科技
 */
@RestController
@RequestMapping(value = "api/AskUser")
@Api(value = "AskController", tags = {"客户端--邀请好友"})
public class ApiAskUserController{

    @Autowired
    HyAskCodeService askCodeService;

    @Autowired
    UserService userService;


    @Autowired
    HyInviteInfoService inviteInfoService;

    @Autowired
    IntegralConfigService integralConfigService;

    /**
     * @param userId
     * @return {@link Boolean} 是否可以拥有填写邀请码logo,某时间点以前注册的用户,不可以参加活动被邀请
     * @throws Exception
     */
    @Login
    @PostMapping(value = "/isShowLogo")
    @ApiOperation("是否可以拥有填写邀请码logo")
    public  R isShowLogo(@ApiIgnore @RequestAttribute(value = "userId") Long userId) throws Exception{
        if (userId == null) {
            return  R.error("用户id必传");
        }
        User user = userService.getById(userId);
        // 定义测试时间点为2018年5月1日
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = formatter.parse("2018-04-01 00:00:00");
        long timestamp = date.getTime();
        long regTime = user.getCreated().getTime();
        if (regTime < timestamp) {
            return  R.error("0");
        } else {
            // 查询是否已经填写过邀请码
            // 判断改手机号有没有创建过预约关系,如果创建过,返回-1
            HyInviteInfo hyInviteInfo = inviteInfoService.getHyInviteInfoByPhone(user.getPhone());
            if (hyInviteInfo != null) {
                return  R.error("0");
            }
            return R.ok("1");
        }
    }


    /**
     * @param userId
     * @return {@link HashMap}
     * 如果没有邀请码,生成邀请码
     * @throws Exception
     */
    @Login
    @PostMapping(value="/getCode")
    @ApiOperation("如果没有邀请码,生成邀请码")
    public R getCode(@ApiIgnore @RequestAttribute(value = "userId") Long userId) {
            if(userId == null){
                return  R.error("用户id必传");
            }
            // 定义map集合
            Map<String, Object> map = new HashMap<>();
            String yqCode = askCodeService.createAskCode(userId);
            if(yqCode != null){
                map.put("yqCode", yqCode);
            }
            return R.ok().put("map",map);
    }

    /**
     * @param hyInviteInfo
     * @return 3.确认接收邀请
     * @throws Exception
     */
    @Login
    @PostMapping(value = "/create")
    @ApiOperation("确认接收邀请")
    public R create(@RequestBody HyInviteInfo hyInviteInfo,@ApiIgnore @RequestAttribute(value = "userId") Long uid) {
            if (hyInviteInfo.getTaskcode() == null) {
                return  R.error("邀请码必传");
            }
            if (uid == null) {
                return  R.error("用户uid必传");
            }
            // 查看填写的手机号是不是邀请码所有者本人
            //查看邀请码是否正确
            HyAskCode askCode = askCodeService.getAskCodeByCode(hyInviteInfo.getTaskcode());
            if (askCode == null) {
                return  R.error("对不起,该邀请码无效,请确认一遍您的邀请码");
            }
            // 查询这个邀请码直接邀请人的所有信息
            User suser = userService.getById(askCode.getUid());
            if (suser.getUid().equals(uid)) {
                return  R.error("不能邀请自己");
            }
        // 判断是否接受过邀请
        HyInviteInfo oldInfo = inviteInfoService.getHyInviteInfoByTuid(uid);
        if (oldInfo != null) {
            return R.error("对不起,您已接受过邀请");
        }
        // 客户端的接受邀请,设置到tuid中,h5端则没有tuid,只有tphone和code
        hyInviteInfo.setTuid(uid);
        Boolean b = inviteInfoService.createInviteInfo(hyInviteInfo);
        if (b)
        {
            return R.ok();
        }
        else {
            return R.error("接受邀请失败");
        }
    }
    /**
     * @param map
     * @return 获取我的邀请列表
     * @throws Exception
     */
    @Login
    @RequestMapping(value = "/getMyInvite", method = RequestMethod.POST)
    @ApiOperation("获取我的邀请列表")
    public R getAllInviterByPage(@RequestBody Map map,@ApiIgnore @RequestAttribute("userId") Long uid) {
        if(uid == null){
            return R.error("邀请者uid必传");
        }
        map.put("suid",uid);
        QueryExt<HyInviteInfo> queryExt = new QueryExt<HyInviteInfo>(map);
        //参数map
        Map pmap = new HashMap();
        pmap.putAll(queryExt.getCondition());
       IPage<HyInviteInfo> iPage = inviteInfoService.getAllInviterByPage(queryExt,pmap);
        return R.ok().put("result",iPage);
    }

}

